Prime Numbers - Sieve of Eratosthenes algorithm

Note: No divide or multiply operations
def prim_nums_erato(A, N):
   A[0] = A[1] = True                          # prime
   for k in range(2, N):
       if A[k]:
           for m in range(2 * k, N, k):        # k + k
               A[m] = False                    # composite

Test

N = 20            # max_num
array = [True] * N
# calculate
prim_nums_erato(array, N)


# show result
for k in range(N):
   print(k, "<-", "prime" if array[k] else "composite")

0 <- prime
1 <- prime
2 <- prime
3 <- prime
4 <- composite
5 <- prime
6 <- composite
7 <- prime
8 <- composite
9 <- composite
10 <- composite
11 <- prime
12 <- composite
. . .

# OR
# lst = []
# for k in range(N):
#     if array[k]:
#         lst.append(k)
# print(lst)
print([i for i in range(len(array)) if array[i]])       # [0, 1, 2, 3, 5, 7, 11, 13, 17, 19]